package com.shujia.wyh.day25;

/*
        创建线程的第一种方式：继承Thread类，重写run方法
        1、创建一个自定义类继承Thread类
        2、这个继承的类要重写run方法
            1）为什么要重写run方法？
            2）重写run方法后如何使用？
        3、根据这个类创建线程对象
        4、启动线程

 */
public class MyThreadDemo2 {
    public static void main(String[] args) {
        //创建线程对象
//        MyThread1 t1 = new MyThread1();

        //启动线程
//        t1.run();
//        t1.run();
        //单纯地调用run方法仅仅表示的是第一个对象调用普通的方法，所以这里的执行还是按照自上而下顺序执行，所以这里依旧是单线程程序
        //要想看到多线程程序的执行效果，就必须换一种方式启动线程。start()
        //(面试题：线程调用start()和run()方法的区别？)
        //run方法中仅仅是封装了被线程执行的逻辑代码，但是直接对象调用run方法于普通的方法调用没有任何区别
        //start()方法调用，首先做的是启动一个线程，然后再由JVM去调用该线程对象中的run()方法
//        t1.start();
        //IllegalThreadStateException 对于一个线程来说，不能启动多次
//        t1.start();

        System.out.println("=====================================================");
        //要想模拟多线程环境，就得创建多个线程对象，然后同时启动
        //模拟多线程环境，至少创建2个及以上的线程对象

        MyThread1 t1 = new MyThread1();
        MyThread1 t2 = new MyThread1();

        //启动线程
        t1.start();
        t2.start();
        /**
         *      注意：
         *          1、启动线程调用的是start()方法
         *          2、线程的调用start()方法先后顺序与今后真正执行的顺序没有影响
         */


    }
}
